package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
)

var db *sql.DB // 一个连接池对象

func initDB() (err error) {
	dsn := "root:123456@tcp(10.10.10.101:33306)/test_demo"
	db, err = sql.Open("mysql", dsn)
	if err != nil { // dsn格式不正确
		fmt.Printf("dsn: %s invalid, err: %v\n", dsn, err)
		return
	}
	err = db.Ping()
	if err != nil { // 连接不上数据库,说明用户名密码错误
		fmt.Printf("open %s failed, err: %v\n", dsn, err)
		return
	}
	// 设置数据库连接池最大连接数
	db.SetMaxOpenConns(10)
	return
}

type user struct {
	id   int
	name string
	age  int
}

func queryOne(id int) {
	var u1 user
	// 1、 查询单条记录的sql语句
	sqlStr := `select id,name,age from user where id = ?;`
	// 2、 执行, 1是参数
	rowObj := db.QueryRow(sqlStr, id) // 查询出来单条记录
	// 3、 拿到结果, 调用Scan()函数会执行关闭数据库连接
	rowObj.Scan(&u1.id, &u1.name, &u1.age)
	// 打印结果
	fmt.Printf("u1: %#v\n", u1)

	// 测试不释放数据库连接,超过设置的数据库最大连接数量
	//for i := 0; i < 11; i++ {
	//	db.QueryRow(sqlStr, 1)
	//	fmt.Printf("开始第%d次查询\n", i)
	//}
	//fmt.Println("执行完了")
}
func queryMore(n int) {
	sqlStr := `select id,name,age from user where id > ?;`
	// 执行
	rows, err := db.Query(sqlStr, n)
	if err != nil {
		fmt.Printf("exec %s failed, err: %v\n", sqlStr, err)
		return
	}
	// 关闭rows
	defer rows.Close()

	// 循环取值
	for rows.Next() {
		var u1 user
		err := rows.Scan(&u1.id, &u1.name, &u1.age)
		if err != nil {
			fmt.Printf("scan failed, err: %v\n", err)
		}
		fmt.Printf("u1: %#v\n", u1)
	}
}

// 新增、修改、删除 都是这个函数
func insert() {
	sqlStr := `insert into user(name,age) values('大黄',3)`
	ret, err := db.Exec(sqlStr)
	if err != nil {
		fmt.Printf("insert failed, err: %v\n", err)
		return
	}
	id, err := ret.LastInsertId()
	if err != nil {
		fmt.Printf("get id failed, err: %v\n", err)
		return
	}
	fmt.Println("insert id: ", id)
}
func update() {
	sqlStr := `update user set name='花瞄', age=2 where id = ?`
	ret, err := db.Exec(sqlStr, 3)
	if err != nil {
		fmt.Printf("insert failed, err: %v\n", err)
		return
	}
	n, err := ret.RowsAffected()
	if err != nil {
		fmt.Printf("get id failed, err: %v\n", err)
		return
	}
	fmt.Println("update row number: ", n)
}
func delete() {
	sqlStr := `delete from user where id = ?`
	ret, err := db.Exec(sqlStr, 2)
	if err != nil {
		fmt.Printf("insert failed, err: %v\n", err)
		return
	}
	id, err := ret.RowsAffected()
	if err != nil {
		fmt.Printf("get id failed, err: %v\n", err)
		return
	}
	fmt.Println("delete row number: ", id)
}

func main() {
	err := initDB()
	if err != nil {
		fmt.Printf("init DB failed, err: %v\n", err)
		return
	}
	fmt.Println("连接数据库成功")

	//queryOne(1)
	//queryMore(0)
	//insert()
	//update()
	delete()
}
